package registe_router_handle

import (
	"crypto/tls"
	"encoding/json"
	"fmt"
	"github.com/kataras/iris/v12"
	config2 "goServer/config"
	"goServer/models"
	"goServer/sessionManage"
	"io/ioutil"
	"net/http"
)

// return json model part
type LoginMessage struct {
	Openid      string `json:"openid"`
	Session_key string `json:"session_key"`
}

type ReturnMessage struct {
	Openid string `json:"openid"`
	Status int    `json:"status"` // status: 是否在数据库中存在，0表示不存在，1表示存在
}

// init part
func Init_login() {
	// GET localhost:8080/login?code=xxx
	// 给定code，返回openid和status ，代表Openid和是否在数据库中存在
	RouterHandles = append(RouterHandles, RouterHandle{
		Method: "GET",
		Router: "/login",
		Handler: func(ctx iris.Context) {
			// write a json to the response body, which have two keys, "username" and "password"

			//res := LoginMessage{
			//	Openid:      "open123",
			//	Session_key: "session456",
			//}

			//get appid and appsecret from request
			jsCode := ctx.URLParam("code")

			ret := getLoginFromWeChat(jsCode, config2.Config.WeixinConfig.Appid, config2.Config.WeixinConfig.Appserect)

			// 将返回的openid和session_key存入数据库SessionManager.Sess中
			sessionManage.Sess.Start(ctx).Set("openid", ret.Openid)
			sessionManage.Sess.Start(ctx).Set("session_key", ret.Session_key)

			res := ReturnMessage{
				Openid: ret.Openid,
			}

			// 测试是否在数据库Students表中存在
			db, err := models.GetDBOnly()
			if err != nil {
				panic(err)
			}
			var student []models.Students
			// 在数据库中搜索WxId为ret.Openid的学生
			db.Where("wx_id = ?", ret.Openid).Find(&student)
			if len(student) == 0 {
				res.Status = 0
			} else {
				res.Status = 1
			}

			ctx.ContentType("application/json")
			ctx.JSON(res)
		},
	})

}

// deal data part (return json model)
func getLoginFromWeChat(jsCode string, appid string, appsecret string) LoginMessage {
	// 创建一个 TLS 配置对象，用于指定证书、密码等信息
	tlsConfig := &tls.Config{InsecureSkipVerify: true}

	// 创建一个自定义的 http.Transport，以便使用上面创建的 TLS 配置
	transport := &http.Transport{TLSClientConfig: tlsConfig}

	// 创建一个新的 http.Client，使用上面创建的 Transport
	client := &http.Client{Transport: transport}

	url := fmt.Sprintf("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", appid, appsecret, jsCode)
	fmt.Println("login to wechat url: ", url)

	resp, err := client.Get(url)

	if err != nil {
		fmt.Println("get login from wechat error")
		return LoginMessage{}
	}

	//输出http头部信息
	//fmt.Println(resp.Body)

	defer resp.Body.Close()

	// 读取响应体内容，并处理错误
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Error:", err)
		return LoginMessage{}
	}

	//// 输出响应体内容
	//fmt.Println(string(body))

	// 将响应体内容映射为LoginMessage结构体
	var lgs LoginMessage
	err = json.Unmarshal(body, &lgs)
	if err != nil {
		fmt.Println("Error:", err)
		return LoginMessage{}
	}

	return lgs

	//openid := resp.Header.Get("openid")
	//sessionkey := resp.Header.Get("session_key")
	//
	//res := LoginMessage{
	//	Openid:      openid,
	//	Session_key: sessionkey,
	//}
	//
	//return res
}
